/**
 * @file main.c
 * @brief 基于AT32F435CGU7芯片编写的控制代码
 * @details 创建FreeRTOS开始任务及外设初始化
 * @author SXT
 * @version v0.1.2
 * @date 2024-10-08
 * @copyright INNOVA
 */
 
 
#include "FreeRTOS.h"
#include "task.h"

#include "at32f435_437_clock.h"
#include "Task_led.h"
#include "Task_mpu.h"
#include "Test_Task.h"
#include "Task_GPS.h"
#include "delay.h"
#include "timer1.h"
#include "Task_OSD.h"
#include "spi2.h"
#include "exti.h"
#include "math.h"
#include "at7456e.h"
#include "Task_Button.h"
#include "button.h"
#include "usart3.h"
#include "adc.h"
#include "usart6.h"
#include "usart1.h"
#include "Task_Compass.h"
#include "Motor.h"
#include "usart4.h"
#include "Task_Timer.h"
#include "usart7.h"

//#include "inv_mpu.h"//陀螺仪驱动库
//#include "inv_mpu_dmp_motion_driver.h"//DMP姿态解读库

#define MS_TICK (system_core_clock / 1000U)

#define BSP_DEBUG
#ifdef BSP_DEBUG 
	//void BSP_Debug(void);
#endif

void BSP_Init(void);
void VL_IR_Driver(void);
void SetVLmode(void);
void SetIRmode(void);

/* 开始任务优先级 */
#define START_TASK_PRIO 1
/* 开始任务堆栈大小 */
#define START_STK_SIZE 128
/* 开始任务任务句柄 */
TaskHandle_t StartTask_Handler;
/* 开始任务入口函数 */
void start_task(void *pvParameters);
extern void Task_Compass_Create(void);

/**
  * @brief  创建开始任务
  * @param  none
  * @return none
  * @retval none
  */

void TaskStart(void)
{
    xTaskCreate((TaskFunction_t )start_task,            //任务函数
                (const char*    )"start_task",          //任务名称
                (uint16_t       )START_STK_SIZE,        //任务堆栈大小
                (void*          )NULL,                  //传递给任务函数的参数
                (UBaseType_t    )START_TASK_PRIO,       //任务优先级
                (TaskHandle_t*  )&StartTask_Handler);   //任务句柄              
    vTaskStartScheduler();          //开启任务调度
}

/**
  * @brief  开始任务函数
  * @param  none
  * @return none
  * @retval none
  */

void start_task(void *pvParameters)
{
	/* 进入临界区 */
	taskENTER_CRITICAL();
	task_LED_Create();
	//Task_mpu9250_Create();
	//task_test_Create();
	Task_Compass_Create();
	task_OSD_Create();
	task_GPS_Create();
	task_Button_Create();
	Timer_Create();

//	task_IMU_Create();
	
	/* 删除开始任务 */
	vTaskDelete(StartTask_Handler);
	/* 退出临界区 */
	taskEXIT_CRITICAL();
}

/**
 * @brief  main function.
 * @param  none
 * @retval none
 */
int main(void)
{
		nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
		system_clock_config();
	
		BSP_Init();
		TaskStart();
}

/**
 * @brief  dirver init
 * @param  none
 * @retval none
 */
void BSP_Init(void)
{
	
	delay_init();
	
#if Power_Flag
	Init_PowerIO();
#endif
	VL_IR_Driver();
	//delay_ms(2000);
	
	SPI2_Init();
	AT7654_Int();
	
	Timer1_init();
//	AT7654_Int();
	
	ButtonInit();
	bat_adc_init();
	
	
	Uart5_Init(115200);
	uart3_init(115200);
	uart2_init(115200);//激光测距
	uart6_init(115200);

#if Black_Board
	uart1_init(9600);
#elif Green_Board
	uart1_init(19200);
#endif

//	Uart7_Init(115200);
	
	Motor_PWM_Init();
//	Iint_GPS_Send();
//	//隔行
//	Uart3Send(IR_BT656_PAL1_Cmd,MyStrlen(IR_BT656_PAL1_Cmd));
//	//逐行
//	//Uart3Send(IR_BT656_PAL2_Cmd,MyStrlen(IR_BT656_PAL2_Cmd));
	
//	unsigned char IR_BT656_PAL1_Cmd[];
////PAL逐行
//unsigned char IR_BT656_PAL2_Cmd[]

}

